﻿using System;
using System.Collections.Generic;
using Csla;
using ENT.PM.Datos.MysqlHelper;
using System.Data;

namespace ENT.PM.Core.Proyecto
{
    [Serializable]
    public class ProyectoAvanceLista :
      ReadOnlyListBase<ProyectoAvanceLista, ProyectoAvanceInfo>
    {
        #region Authorization Rules

        private static void AddObjectAuthorizationRules()
        {
            // TODO: add authorization rules
            //AuthorizationRules.AllowGet(typeof(ProyectoAvanceLista), "Role");
        }

        #endregion

        #region Factory Methods

        public static ProyectoAvanceLista GetProyectoAvanceLista(ProyectoCriterio criterio)
        {
            return DataPortal.Fetch<ProyectoAvanceLista>(criterio);
        }

        private ProyectoAvanceLista()
        { /* require use of factory methods */ }

        #endregion

        #region Data Access

        private void DataPortal_Fetch(ProyectoCriterio criterio)
        {
            RaiseListChangedEvents = false;
            IsReadOnly = false;
            // TODO: load values
            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros = new MySql.Data.MySqlClient.MySqlParameter[4];
            parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("E", criterio.ProgramaId);
            parametros[1] = new MySql.Data.MySqlClient.MySqlParameter("IDP", criterio.EjeId);            
            parametros[2] = new MySql.Data.MySqlClient.MySqlParameter("EID", criterio.EstadoId);
            parametros[3] = new MySql.Data.MySqlClient.MySqlParameter("N",string.Format("%{0}%", criterio.Nombre));

            foreach (DataRow items in objhm.EjecutarStoreProcedure(parametros, "Listar_Avances_Proyectos").Tables[0].Rows)
            {
                this.Add(ProyectoAvanceInfo.GetProyectoAvanceInfo(items));
            }

            IsReadOnly = true;
            RaiseListChangedEvents = true;
        }

        #endregion
    }


    [Serializable]
    public class ProyectoAvanceInfo : ReadOnlyBase<ProyectoAvanceInfo>
    {
        #region Business Methods

        // TODO: add your own fields, properties and methods
        public int Id { get; set; }
        public string Nombre { get; set; }
        public DateTime? FechaInicio { get; set; }
        public DateTime? FechaFin { get; set; }
        public double Presupuesto { get; set; }
        //public double Latitud { get; set; }
        //public double Longitud { get; set; }
        //public string Viabilidad { get; set; }
        //public string Dictamen { get; set; }
        public string Descripcion { get; set; }
        public double Saldo { get; set; }
        public double UltimoPago { get; set; }
        public double AportePlan { get; set; }
        public double AportePlanConDescuento { get; set; }
        public double TotalDesembolsado { get; set; }
        public int PorcentajeAvance { get; set; }
        public string Estado { get; set; }
        //public int Tipo { get; set; }
        public int NumeroDias { get; set; }
        public int DiasTranscurridos { get; set; }
        public int DiasFaltantes { get; set; }
        public double PorcentajeDias { get; set; }
        public double PorcentajeDesembolso { get; set; }

        #endregion

        #region Factory Methods

        internal static ProyectoAvanceInfo GetProyectoAvanceInfo(DataRow childData)
        {
            return DataPortal.FetchChild<ProyectoAvanceInfo>(childData);
        }

        private ProyectoAvanceInfo()
        { /* require use of factory methods */ }

        #endregion

        #region Data Access

        private void Child_Fetch(DataRow childData)
        {
            this.Id = Convert.ToInt32(childData[0].ToString());
            this.Nombre = childData[1].ToString();
            this.Descripcion = childData[2].ToString();
            DateTime fI, fF;
            DateTime.TryParse(childData[3].ToString(), out fI);
            DateTime.TryParse(childData[4].ToString(), out fF);
            this.FechaInicio = fI;
            this.FechaFin = fF;
            this.Presupuesto = Convert.ToDouble(childData[5].ToString());
            this.NumeroDias = Convert.ToInt32(childData[6].ToString());
            this.DiasTranscurridos = Convert.ToInt32(childData[7].ToString());
            this.DiasFaltantes = Convert.ToInt32(childData[8].ToString());
            double pd;
            double.TryParse(childData[9].ToString(),out pd);
            this.PorcentajeDias = pd;

            this.Estado = childData[10].ToString();
            //this.Tipo = Convert.ToInt32(childData[7].ToString());

            /*this.Latitud = Convert.ToDouble(childData[23].ToString());
            this.Longitud = Convert.ToDouble(childData[24].ToString());
            this.Dictamen = childData[26].ToString();
            this.Viabilidad = childData[27].ToString();
            this.Saldo = Convert.ToDouble(childData[31].ToString());
            this.UltimoPago = Convert.ToDouble(childData[32].ToString());*/
            this.AportePlan = Convert.ToDouble(childData[11].ToString());
            this.AportePlanConDescuento = Convert.ToDouble(childData[11].ToString());
            this.TotalDesembolsado = Convert.ToDouble(childData[12].ToString());
            this.PorcentajeDesembolso = Convert.ToDouble(childData[13].ToString());
            this.PorcentajeAvance = Convert.ToInt32(Convert.ToDouble(childData[14].ToString()));

        }

        #endregion
    }
}